package com.supermarket.domain.cart;

import com.supermarket.domain.fruit.base.Fruit;

import java.math.BigDecimal;
import java.util.HashMap;
import java.util.Map;


/**
 * 购物车类（使用组合模式管理商品）
 */
public class ShoppingCart {
    private final Map<Fruit, BigDecimal> items = new HashMap<>();
    private boolean totalDiscountEnabled = false;
    private BigDecimal discountThreshold = new BigDecimal("100.00");
    private BigDecimal discountAmount = new BigDecimal("10.00");

    /**
     * 添加商品（支持任意斤数）
     * @param quantity 斤数（如0.37斤）
     */
    public void addItem(Fruit fruit, BigDecimal quantity) {
        if (quantity.compareTo(BigDecimal.ZERO) <= 0) {
            throw new IllegalArgumentException("斤数必须大于0");
        }
        items.merge(fruit, quantity, BigDecimal::add);
    }

    /**
     * 计算购物清单的最终总价（包含支持满减促销策略）
     * 计算逻辑：先累加所有商品的小计金额，再根据满减规则（若启用）计算最终价格
     * @return 最终总价（确保非负）
     */
    public BigDecimal calculateTotal() {
        // 1. 计算所有商品的小计金额总和
        // 遍历购物清单中的每一项（商品类型 -> 购买数量）
        // 调用商品类型自身的calculatePrice方法计算该商品的总价（单价×数量，已考虑商品自身折扣）
        // 最后将所有商品的总价累加得到小计金额
        BigDecimal subtotal = items.entrySet().stream()
                .map(entry -> entry.getKey().calculatePrice(entry.getValue())) // 计算单个商品总价
                .reduce(BigDecimal.ZERO, BigDecimal::add); // 累加所有商品总价

        // 2. 应用满减策略（若满减功能已启用，且小计金额达到满减门槛）
        if (totalDiscountEnabled && subtotal.compareTo(discountThreshold) >= 0) {
            subtotal = subtotal.subtract(discountAmount); // 减去满减金额
        }

        // 3. 确保最终价格不会为负数（如满减后金额可能为负，取0作为最低值）
        return subtotal.max(BigDecimal.ZERO);
    }

    // 设置满减策略
    public void enableTotalDiscount(boolean enabled) {
        this.totalDiscountEnabled = enabled;
    }
}
